const express = require('express')
const path = require('path')
const cors = require('cors')
const fs = require('fs')

const app = express()
// Q: privateKey 和 certificate 的作用 ？
// A：自签名证书 不受浏览器信任 测试使用
const privateKey = fs.readFileSync('./src/config/ssl/cast.arce.top.key', 'utf8')
const certificate = fs.readFileSync('./src/config/ssl/cast.arce.top.cer', 'utf8')
const credentials = { key: privateKey, cert: certificate }
// console.log(credentials)
const httpsServer = require('https').createServer(credentials, app)

// 设置静态资源目录   可用于文件上传 使用 mutler
app.use('/static', express.static(path.join(__dirname, 'public')))
// 接口文档
// app.use('/apidoc', express.static(path.join(__dirname, 'apidoc')))
console.log('static>>>>>>>>>>>', path.join(__dirname, 'apidoc'))
// 跨域配置
app.use(cors())

// 解析json类型的请求 - application/json
app.use(express.json())
// 解析传统表单类型的请求 - application/x-www-form-urlencoding
app.use(express.urlencoded({ extended: true }))

// 数据模型
const db = require('./src/models')

/**
 *  READ : 数据库迁移和同步是一个比较重要的问题
 *  在sequelize中一般有 数据库同步 和续集迁移 两种方式
 *    数据同步方式 ：
 *      db.sequelize.sync()
 *      这种方式方便快捷，但是在切换系统架构时数据迁移会比较麻烦
 *    续集迁移方式 ：
 *      使用 migration (创建了migrations和seeders) [https://sequelize.org/docs/v6/other-topics/migrations/]
 *  TODO 为了方便开发
 *    在运行前先执行一遍强制同步初始化数据 然后切换成 db.sequelize.sync()
 */
// CASE 1： 数据库同步
db.sequelize.sync()
// CASE 2： 强制同步 drop the table if it already exists
// db.sequelize.sync({ force: true }).then(() => {
//   db.role.create({
//     id: 1,
//     name: 'user'
//   })
//
//   db.role.create({
//     id: 2,
//     name: 'moderator'
//   })
//
//   db.role.create({
//     id: 3,
//     name: 'admin'
//   })
// })

// 测试路由
app.get('/', (req, res) => {
  res.json({ message: 'Welcome to cast-souls application.' })
})

// 业务路由
// require('./src/routes/turorial.routes.local')(app)
require('./src/routes/auth.routes')(app)
require('./src/routes/user.routes')(app)
// 监听端口
// const PORT = process.env.PORT || 3008 // 小程序需要https 所有 只监听 https接口即可
const SSLPORT = process.env.SSLPORT || 3007
// app.listen(PORT)
httpsServer.listen(SSLPORT, () => {
  // eslint-disable-next-line no-console
  console.log(`Server is running on port ${SSLPORT}.`)
})

module.exports = app
